Explorer
/tmp/2026-08-02 Worker-Watcher und Agent-Solutions-Zentrale – Projektstand.before-portal-time-update.md
← Zurück ↓ Download
---
title: "Worker-Watcher und Agent-Solutions-Zentrale – Projektstand"
date: 2026-08-02
updated: 2026-08-02
status: produktiv-mit-offenen-ui-punkten
type: projektstand
projects:
  - worker-watcher
  - agent-solutions-zentrale
systems:
  - VPS IONOS
  - Worker-Watcher
  - Agent Solutions Zentrale Steuerung
tags:
  - worker-watcher
  - agent-solutions
  - monitoring
  - hermes
  - vps
  - codex
  - projektstand
---

# Worker-Watcher und Agent-Solutions-Zentrale – Projektstand

## Kurzstatus

> [!status] Projektstatus
> - Worker-Watcher: produktiv aktiv; `hermes-worker-watcher.service` läuft seit dem kontrollierten Tabellenlayout-Neustart `2026-08-02T17:29:52Z`.
> - Worker-Watcher-Code: lokal verifiziert mit Compileall, Ruff, Mypy und 34 Pytest-Tests.
> - Warnkachel: produktiv aktiv über die serverseitige Portal-Brücke.
> - Gesamtzustand des Watchers: `degraded` bei `database_status=ok`.
> - Warnzusammenfassung der Kachel: `critical`, mit 3 aktiven Warnfällen.
> - Ursache des `degraded`-Zustands: überwachte Anwendungen und ein fehlender Docker-Container, nicht ein ausgefallener Watcher.
> - Header der Worker-Oberfläche: nach der letzten Live-Abnahme innerhalb des gemeinsamen Inhaltsrahmens; die frühere Korrektur ist nachgewiesen.
> - Verbleibender UI-Punkt: sichtbare Resttexte wie `?ffnen` im Portal sind nicht Bestandteil dieser Tabellenkorrektur und wurden nicht korrigiert.

Die aktuelle technische Momentaufnahme wurde am `2026-08-02T17:09:49Z` über die lokalen API-Endpunkte und die SQLite-Datenbank im Read-only-Modus erhoben. Die laufende Anwendung ist technisch erreichbar; fachlich bleiben überwachte Probleme aktiv.

## Ausgangslage

Der Bedarf war eine zentrale, möglichst breit einsetzbare Überwachung von KI-Workern und Automationen. Der Ausführungsort eines Workers ist nicht zuverlässig auf den VPS begrenzbar. Deshalb überwacht der Worker-Watcher lokale Systemd-Dienste, Docker-Container und Prozesse und besitzt zusätzlich eine Remote-Agent-Schnittstelle für spätere oder außerhalb des VPS laufende Quellen.

Der Watcher soll Zustände sichtbar machen, ohne produktive Jobs zu steuern. Er ist keine Start-/Stop-Zentrale, kein Auto-Healing-System und keine zweite fachliche Alarmierungslogik. Seine Aufgabe ist die normalisierte Beobachtung, Speicherung, Historisierung und Bereitstellung von Statusdaten.

Die Agent-Solutions-Zentrale war zunächst eine statische Navigationsseite. Sie erhielt eine Warnkachel, damit der Nutzer den verdichteten Zustand der überwachten Worker direkt am Einstiegspunkt erkennt und zur vollständigen Worker-Überwachung wechseln kann.

## Ziel und Architektur

Die umgesetzte Kette lautet:

```text
Lokaler Collector oder Remote-Agent
        ↓
Normalisierung der Beobachtung
        ↓
SQLite: aktueller Status, Beobachtungen, Ereignisse, Collector-Läufe
        ↓
HTTP-API und Worker-Watcher-Weboberfläche
        ↓
Serverseitige Portal-Brücke zur Agent-Solutions-Zentrale
        ↓
Verdichtete Warnkachel und Verlinkung zur Detailansicht
```

Die Collector überwachen ihre Quellen read-only. Die Datenbank des Watchers wird für die eigene Beobachtungs- und Ereignishistorie beschrieben. Ein Remote-Agent darf Beobachtungen an die API senden; dadurch wird der Watcher-Datenbestand erweitert, aber kein überwachtes Produktivsystem gesteuert.

Wichtige Trennungen:

- Quelle beziehungsweise Anwendung: gemeldeter Zustand des Dienstes, Containers oder Prozesses.
- Watcher: Fähigkeit, Quellen zu lesen, zu normalisieren und zu speichern.
- Portal: reine Darstellung einer vom Watcher gelieferten Zusammenfassung.
- Warnkachel: keine eigene zweite Bewertung der einzelnen Jobs.

## Beteiligte Systeme

| System | Rolle | Aktueller Nachweis |
|---|---|---|
| Worker-Watcher | Zentrale Bewertungs-, Speicher- und API-Schicht | `hermes-worker-watcher.service` aktiv; `/health/live` liefert `{"status":"live"}` |
| SQLite-Datenbank | Aktueller Status, Beobachtungen, Ereignis- und Collector-Historie | `/opt/struktur/hermes-workspace/worker-watcher/data/watcher.sqlite`, Schema-Version 2 |
| Agent Solutions Zentrale | Portal mit Navigationskacheln und Warnkachel | `portal.service` aktiv; `/api/worker-alerts` liefert `ok=true` |
| Systemd | Quelle für 15 konfigurierte Dienstdefinitionen | `systemd`-Collector aktiv |
| Docker | Quelle für 6 konfigurierte Containerdefinitionen | `docker`-Collector aktiv; `telefon-agent` fehlt |
| `/proc` | Quelle für den Prozess `hermes` | `process`-Collector aktiv |
| Remote-Agent-Schnittstelle | Erweiterung für Worker außerhalb des lokalen Collector-Scope | aktiviert, aktuell 0 registrierte Agenten |

## Relevante URLs

Öffentliche beziehungsweise in der Oberfläche hinterlegte Ziele:

- Worker-Watcher: `https://worker.agentsolutions-mallorca.com`
- Agent Solutions Zentrale: `https://agentsolutions-mallorca.com`
- Portal-Link zur Worker-Überwachung: `https://worker.agentsolutions-mallorca.com`

Lokale Prüfziele:

- Worker-Watcher: `http://127.0.0.1:8088/`
- Portal: `http://127.0.0.1:5052/`
- Portal-Watcher-Brücke: `http://127.0.0.1:5052/api/worker-alerts`

Die öffentlichen URLs wurden als UI-Ziele beziehungsweise Konfiguration dokumentiert. Die in diesem Dokument maßgeblichen HTTP-Abnahmen erfolgten gegen die lokalen Dienste.

## Dienste und Projektpfade

### Worker-Watcher

- Projekt: `/opt/struktur/hermes-workspace/worker-watcher`
- Startbefehl:

```text
/opt/struktur/hermes-workspace/worker-watcher/.venv/bin/watcher --config /opt/struktur/hermes-workspace/worker-watcher/config.yaml serve
```

- Systemd-Unit: `hermes-worker-watcher.service`
- Arbeitsverzeichnis: `/opt/struktur/hermes-workspace/worker-watcher`
- Python-Version: `3.12.3` laut Audit vom 01.08.2026
- API-Host und Port: `127.0.0.1:8088`
- Zyklusintervall: 60 Sekunden
- Anzeigezeitzone: `Europe/Madrid`
- Datenbank: `/opt/struktur/hermes-workspace/worker-watcher/data/watcher.sqlite`

### Agent Solutions Zentrale

- Projekt: `/opt/struktur/portal`
- Produktive Quelldatei: `/opt/struktur/portal/app.py`
- Systemd-Unit: `portal.service`
- Startbefehl:

```text
/usr/bin/python3 /opt/struktur/portal/app.py
```

- Arbeitsverzeichnis: `/opt/struktur/portal`
- Lokaler Port: `127.0.0.1:5052`
- Watcher-Brücke: standardmäßig `http://127.0.0.1:8088/api/v1/alerts/summary`

## Worker-Watcher – umgesetzter Stand

- Lokale Collector für Systemd, Docker und Prozesse.
- Konfigurierbare, derzeit deaktivierte Collector für Cron und Generic Worker.
- Isolierte Collector-Ausführung mit individuellem Timeout.
- Normalisierung in getrennte Statusachsen.
- SQLite-Migrationen und versioniertes Schema.
- Aktueller Status je Job-Instanz.
- Beobachtungs- und Statusereignishistorie.
- Collector-Laufhistorie und Watcher-Ereignisse.
- Read-only Health-, Status-, Job-, Ereignis- und Collector-Endpunkte.
- Remote-Agent-Registrierung und idempotenter Remote-Event-Eingang.
- Verdichteter Endpunkt `/api/v1/alerts/summary` für die Portalwarnkachel.
- Deutsche Weboberfläche mit getrennten Gruppen für zentrale Infrastruktur, Projekt-Worker, Automationen, weitere Aufgaben und Remote-Agenten.
- Manueller und automatischer Browserabruf der Weboberfläche.

Nicht umgesetzt und bewusst nicht Teil der Architektur:

- Auto-Healing.
- Starten, Stoppen oder Neustarten überwacht­er Jobs aus dem Watcher.
- Künstlich angelegte Remote-Agenten.
- Browser-Spezialcollector ohne nachgewiesenen Browser-Worker.

## Datenmodell und Statuslogik

Das SQLite-Schema enthält unter anderem:

| Entität | Tabelle | Zweck |
|---|---|---|
| Job | `jobs` | Logische Workerdefinition |
| Instanz | `job_instances` | Konkrete Ausprägung nach Host, Runtime und Quelle |
| Run | `job_runs` | Echte Läufe mit Run-ID, Laufzeit, Exitcode und Fehler |
| Beobachtung | `job_observations` | Einzelne Collector- oder Remote-Beobachtung |
| Aktueller Status | `job_status_current` | Letzter normalisierter Status je Instanz |
| Statusereignis | `status_events` | Relevante Änderungen des effektiven Status |
| Collector-Lauf | `collector_runs` | Erfolg, Fehler, Laufzeit und Beobachtungszahlen |
| Watcher-Ereignis | `watcher_events` | Collector- und Watcherfehler |
| Remote-Agent | `execution_agents` | Agentenidentität, Umgebung, Host und Heartbeat |
| Remote-Event | `remote_events` | Idempotenter Eingang externer Beobachtungen |

Die Statusdimensionen sind getrennt:

- `operational_state`: `scheduled`, `running`, `waiting`, `paused`, `stopped`, `completed`, `unknown`.
- `health_status`: `healthy`, `degraded`, `failed`, `stale`, `unknown`.
- `observation_status`: `fresh`, `stale`, `unavailable`.
- `severity`: `info`, `warning`, `critical`.

Beispiele der Normalisierung:

- Nicht lesbare Quelle oder Berechtigungsproblem → `health_status=unknown`, `observation_status=unavailable`.
- Nichtnull-Exitcode → `operational_state=stopped`, `health_status=failed`.
- Pausierter Job → `operational_state=paused`, nicht automatisch `failed` oder `stale`.
- Bei `unavailable` bleibt der letzte bekannte Health- und Operational-Status erhalten; die aktuelle Beobachtung wird separat als nicht verfügbar markiert.

Der globale Watcherstatus ist aktuell `healthy` oder `degraded`. Im aktuellen Live-Stand ist die Datenbank `ok`, aber es gibt einen Collectorfehler sowie Jobprobleme. Daher lautet der Watcherstatus `degraded`.

## API-Endpunkte

Die folgenden Endpunkte sind im aktuellen HTTP-Server vorhanden. GET-Endpunkte lesen Watcher-Daten; sie steuern keine überwachten Systeme. Die beiden POST-Endpunkte betreffen ausschließlich den Eingang von Remote-Agent-Daten und verlangen bei gesetztem Agent-Token die konfigurierte Authentifizierung.

| Endpunkt | Zweck | Nutzer / Bedeutung |
|---|---|---|
| `GET /health` | Vollständige technische Watcher-Gesundheit mit Datenbank-, Collector-, Job- und Zyklusdaten | Betrieb, Dashboard und Abnahme |
| `GET /health/live` | Minimaler Prozess-Liveness-Nachweis | Systemd-/Load-Balancer-Prüfung |
| `GET /health/ready` | Readiness inklusive Schema-Version | Start- und Betriebsprüfung |
| `GET /api/v1/status` | Aktueller Watcherstatus, Collectorstatus und Jobzähler | Worker-Oberfläche und externe Read-only-Prüfung |
| `GET /api/v1/jobs` | Liste der aktuellen Job- und Instanzdaten | Tabellen der Worker-Oberfläche |
| `GET /api/v1/jobs/{instance_id}` | Detaildaten einer einzelnen Job-Instanz | Detailprüfung eines konkreten Workers |
| `GET /api/v1/workers` | Worker-orientierte Sicht auf registrierte Beobachtungen | API- und Integrationsnutzer |
| `GET /api/v1/agents` | Registrierte Remote-Agenten | Agentenbereich der Oberfläche |
| `GET /api/v1/remote-events` | Eingegangene Remote-Events | Diagnose und Idempotenzprüfung |
| `GET /api/v1/events` | Status- und Watcher-Ereignisse | Ereignishistorie der Oberfläche |
| `GET /api/v1/collectors` | Konfiguration, Aktivierung und Version der Collector | Collector-Transparenz |
| `GET /api/v1/collectors/runs` | Historie der Collector-Läufe | Lauf- und Fehlerdiagnose |
| `GET /api/v1/collectors/{collector_name}` | Detailinformationen eines Collectors | Technische Einzelprüfung |
| `GET /api/v1/alerts/summary` | Verdichtete Warnzusammenfassung für die Portal-Kachel | Agent-Solutions-Zentrale; keine zweite Einzeljobbewertung |
| `POST /api/v1/agents/register` | Registrierung eines Remote-Agenten | Nur Remote-Agent-Integration; schreibt Watcher-Metadaten |
| `POST /api/v1/agents/events` | Idempotenter Eingang eines Remote-Events | Nur Remote-Agent-Integration; erzeugt Beobachtungsdaten |

Zum Dokumentationszeitpunkt antworteten die für die Abnahme verwendeten GET-Endpunkte lokal mit HTTP 200. Die Oberfläche nutzt insbesondere `/api/v1/status`, `/api/v1/jobs`, `/api/v1/agents` und `/api/v1/events`; die Portal-Brücke nutzt `/api/v1/alerts/summary`.

## Collector und überwachte Quellen

Aktuelle Konfiguration aus `/opt/struktur/hermes-workspace/worker-watcher/config.yaml`:

| Collector | Typ | Aktiv | Definitionen |
|---|---|---:|---:|
| `systemd` | `systemd` | ja | 15 Dienste |
| `docker` | `docker` | ja | 6 Container |
| `process` | `process` | ja | Prozess `hermes` |
| `cron` | `cron` | nein | 0 |
| `generic-worker` | `generic_worker` | nein | 0 |

Der aktuelle Live-Datenbankstand vom `2026-08-02T17:08:45Z`:

- Jobs: `22`
- Job-Instanzen: `22`
- Beobachtungen: `36.429`
- Aktueller Statuszeilen: `22`
- Statusereignisse: `22`
- Collector-Läufe: `4.993`
- Watcher-Ereignisse: `1.640`
- Echte Runs in `job_runs`: `0`
- Remote-Agenten: `0`
- Remote-Events: `0`
- Runtime-Typen: `docker`, `process`, `systemd`

Die Auditwerte vom `2026-08-01` waren `4.991` Beobachtungen, `706` Collector-Läufe und `211` Watcher-Ereignisse. Die höheren aktuellen Werte sind durch weitere laufende Prüfzyklen entstanden und ersetzen die historischen Werte nicht.

Ein Browser-Scope wurde im Audit read-only geprüft. Es wurden keine Chrome-, Chromium-, Playwright-, Puppeteer- oder Selenium-Prozesse gefunden; ein File-Browser ist vorhanden. Ein Browser-Spezialcollector ist deshalb nicht begründet.

## Tabellen und Sortierfunktionen

Die Worker-Oberfläche enthält fachlich getrennte Tabellen für zentrale Infrastruktur, Projekt-Worker, Automationen und Hintergrund-Worker, weitere überwachte Aufgaben, Remote-Agenten sowie letzte Ereignisse.

Umgesetzt beziehungsweise im Code nachgewiesen:

- Spalten `Letzte Aktivität`, `Seit`, `Betriebszustand`, `Gesundheit`, `Beobachtung`, `Nächster Lauf / Überfällig` und `Grund`.
- Separate Sortierzustände je Tabelle beziehungsweise Fachgruppe.
- Aufsteigende und absteigende Sortierung.
- Dritter Klick setzt die jeweilige Standardsortierung zurück.
- Tastaturbedienbare Sortierbuttons.
- `aria-sort` und Sortierpfeile.
- Deutsche Textsortierung über `Intl.Collator('de-DE', {sensitivity:'base', numeric:true})`.
- Numerische Sortierung für Zeit, Dauer und Zählwerte.
- Kritische beziehungsweise fehlerhafte Zustände werden in den fachlichen Standardsortierungen priorisiert.
- Sortierzustand bleibt beim Aktualisieren erhalten, weil die Tabellen mit den bestehenden `tableStates` erneut gerendert werden.
- Die Sortierung erfolgt ausschließlich innerhalb der jeweiligen fachlichen Gruppe.
- Die Tabellenlayout-Korrektur vom `2026-08-02` setzt für Worker-Tabellen `table-layout: fixed`, begrenzt die Spalten innerhalb der verfügbaren Breite, lässt Überschriften umbrechen und erzwingt sichere Umbrüche für lange Worker-/Dienstnamen.
- Die zentrale Infrastruktur und die Projekt-Worker verwenden getrennte prozentuale Spaltenverteilungen; dadurch bleibt insbesondere die letzte Überschrift innerhalb des Tabellenrahmens.
- Die Änderung wurde mit Compileall, 34 Pytest-Tests und einer Live-Auslieferungsprüfung gegen `http://127.0.0.1:8088/` verifiziert.

Die mobile Prüfung wurde mit Playwright gegen die produktive lokale Oberfläche durchgeführt. Die Tabellen behalten wegen ihrer fachlichen Spaltenbreite einen horizontal scrollbaren Tabellenbereich; die Seite selbst erzeugt keinen horizontalen Header-Überlauf.

## Deutsche Benutzeroberfläche

Sichtbare Status- und Tabellenbegriffe wurden auf Deutsch abgebildet, unter anderem:

- `healthy` → `Fehlerfrei`
- `degraded` → `Gestört`
- `failed` → `Fehlgeschlagen`
- `unknown` → `Unbekannt`
- `unavailable` → `Nicht verfügbar`
- `fresh` → `Aktuell`
- `stale` → `Veraltet`
- `running` → `Läuft`
- `stopped` → `Gestoppt`
- `waiting` → `Wartet`
- `completed` → `Abgeschlossen`

Interne API-, Datenbank-, Collector- und Enumwerte bleiben englisch. Technische Eigennamen wie Systemd-Units, Docker-Container und Job-Keys bleiben unverändert.

Die sprachliche Abnahme ist nicht vollständig abgeschlossen: Im Portal stehen in der vorhandenen statischen Kachelstruktur noch sichtbare Schreib-/Encoding-Restwerte wie `?ffnen` und `Oeffnet`. Diese wurden in dieser Sitzung nicht geändert und sind kein Watcherfehler.

## Warnkachel in der Agent-Solutions-Zentrale

Die Kachel `Worker-Warnungen` steht in der Startseite der Agent-Solutions-Zentrale als erste Kachel und spannt die gesamte erste Grid-Zeile. Darunter folgen die statischen Kacheln in der vorgesehenen Reihenfolge:

1. `Cockpit Carlo`
2. `Projects`
3. `VPS Verwaltung`
4. `KI & Automation`
5. `Hermes Scout`
6. `Hermes VPS`

Die Datenquelle ist ausschließlich die serverseitige Portal-Brücke in `/opt/struktur/portal/app.py`. Sie ruft read-only den Watcher-Endpunkt `/api/v1/alerts/summary` ab und liefert eine validierte Zusammenfassung an den Browser. Das Portal bewertet nicht noch einmal alle Einzeljobs.

Aktueller Kachelstand vom `2026-08-02T17:09:49Z`:

- Gesamtstatus der Warnzusammenfassung: `critical`.
- Watcherstatus innerhalb der Zusammenfassung: `degraded`.
- Aktive Warnfälle: `3`.
- Jobs insgesamt: `22`.
- Fehlerfrei: `19`.
- Gestört: `1`.
- Fehlgeschlagen: `1`.
- Unbekannt: `1`.
- Nicht verfügbare Beobachtung: `1`.
- Ältestes Problem: `Telefon Agent`, Beobachtung nicht verfügbar.

Die Kachel zeigt Warn- beziehungsweise Fehlerfarben abhängig von der verdichteten Zusammenfassung. Ein `degraded`-Watcherstatus bedeutet nicht automatisch, dass der Watcher selbst defekt ist. Im aktuellen Fall ist die Datenbank erreichbar und die Prüfzyklen laufen; die Probleme stammen aus überwachten Quellen und einem fehlenden Docker-Objekt.

Die Kachel verlinkt zur vollständigen Worker-Überwachung unter `https://worker.agentsolutions-mallorca.com`.

## Aktualisierungsfunktionen

### Worker-Überwachung

Die Worker-Oberfläche besitzt einen manuellen Button `Aktualisieren` und einen automatischen Abruf im 15-Sekunden-Intervall.

- Der Browser ruft Status, Jobs, Agenten und Ereignisse gemeinsam ab.
- Der Button wird während eines laufenden Abrufs deaktiviert.
- Parallele manuelle und automatische Abrufe werden über `refreshInFlight` gebündelt.
- `Zuletzt aktualisiert` bezeichnet den letzten erfolgreichen vollständigen Browserabruf.
- `Letzte Watcher-Prüfung` bezeichnet dagegen `status.last_cycle_finished_at`, also den fachlichen Prüfzyklus des Watchers.
- Bei Erfolg erscheint `Aktualisiert` nur nach manuellem Abruf inline in der zweiten Meta-Zeile und wird nach ungefähr 2 Sekunden ausgeblendet.
- Automatische Abrufe erzeugen keine dauerhafte Erfolgsmeldung.
- Bei Abruffehler bleiben bereits geladene Tabellen erhalten; die Fehlermeldung ist temporär.
- Die Sortierzustände der Tabellen bleiben beim Aktualisieren erhalten.

### Agent-Solutions-Zentrale

Die Zentrale besitzt einen globalen Button `Aktualisieren` für die dynamische Warnkachel und ein automatisches 60-Sekunden-Polling.

- Der Abruf erfolgt gegen `/api/worker-alerts` des Portals.
- Das Portal ruft intern `/api/v1/alerts/summary` des Watchers ab.
- `Zuletzt aktualisiert` bezeichnet den letzten erfolgreichen Browserabruf der Portal-Brücke.
- Die Warnkachel enthält zusätzlich `Letzte Prüfung` als relative Darstellung des letzten Watcher-Zyklus.
- Erfolg und Fehler werden temporär unterhalb des Buttons angezeigt; die statische Kachelstruktur wird nicht verändert.
- Ein Bridgefehler blockiert nicht die übrigen Navigationskacheln.
- Vorhandene Daten bleiben im Fehlerfall als letzter Stand sichtbar und werden als veraltet beziehungsweise nicht erreichbar gekennzeichnet.

Die beiden Zeitpunkte sind fachlich verschieden: Browserabruf ist nicht gleich Watcher-Prüfzyklus.

## Tests und technische Nachweise

Die zuletzt ausgeführten isolierten Worker-Watcher-Prüfungen am `2026-08-02` lauteten:

```text
/opt/struktur/hermes-workspace/worker-watcher/.venv/bin/python -m compileall -q src tests
/opt/struktur/hermes-workspace/worker-watcher/.venv/bin/ruff check src tests
/opt/struktur/hermes-workspace/worker-watcher/.venv/bin/mypy src
/opt/struktur/hermes-workspace/worker-watcher/.venv/bin/pytest -q
```

Ergebnis:

- Compileall: erfolgreich.
- Ruff: `All checks passed!`.
- Mypy: `Success: no issues found in 25 source files`.
- Pytest: `34 passed`.

Zusätzliche Browsernachweise:

- Worker-Header und Inhaltsrahmen: 25 Playwright-Checks.
- Aktualisierungsvisualisierung mit stabiler Buttonbreite: 14 Playwright-Checks.
- Desktop-Wide, Desktop, Tablet und Mobil wurden geprüft.
- Der Header-Rahmen wurde gegen die `main`-Begrenzung gemessen.
- Kein horizontaler Seitenüberlauf.
- Manueller Abruf, deaktivierter Button, Ladezustand und temporäre Erfolgsmeldung wurden geprüft.
- Der lokale Health-Endpunkt `/health/live` und die Readiness-Prüfung antworteten mit HTTP 200.
- `/api/v1/alerts/summary` antwortete mit HTTP 200.
- Die Portal-Brücke `/api/worker-alerts` antwortete mit `{"ok":true}`.

Der Auditstand vom `2026-08-01` meldete historisch `29 passed`; der aktuelle Teststand ist mit `34 passed` höher.

## Produktive Aktivierungen

Die Aktivierungen und Prüfungen wurden über mehrere Arbeitsschritte durchgeführt. Verifizierbare aktuelle Zustände:

- `hermes-worker-watcher.service`: aktiv, letzter nachgewiesener Neustart `2026-08-02T17:29:52Z` nach der Tabellenlayout-Korrektur.
- `portal.service`: aktiv, letzter nachgewiesener Neustart `2026-08-02T16:40:27Z`.
- Worker-Watcher-API: lokal erreichbar und liefert aktuelle Collector- und Alertdaten.
- Warnkachel: produktiv über `portal.service` und die lokale Bridge aktiv.
- Tabellen- und Sortierfunktionen: im Worker-Service enthalten und durch Tests/Browserprüfungen verifiziert.

Historische Auditzeiten vom `2026-08-01`, darunter frühere Aktivierungen ab etwa `20:12 UTC` und ein Neustart um `20:36 UTC`, stammen aus dem damaligen Audit. Für die aktuelle Abnahme ist der zuletzt direkt nachgewiesene Zustand maßgeblich.

## Bekannte Probleme der überwachten Anwendungen

### `project.youtube.e2e`

- Status: `operational_state=stopped`, `health_status=degraded`, `observation_status=fresh`.
- Quelle: `youtube-research-e2e-worker.service` über den Systemd-Collector.
- Nachweis: `LoadState=loaded`, `ActiveState=inactive`, `SubState=dead`, `systemd_Result=success`, Exitcode `0`.
- Zuständiges System: YouTube-E2E-Worker beziehungsweise dessen Betriebsentscheidung.
- Änderung am Watcher erforderlich: Nein.
- Änderung an der überwachten Anwendung beziehungsweise Betriebsplanung: Ja, falls der Worker dauerhaft laufen oder geplant gestartet werden soll.

### `project.youtube.graphiti`

- Status: `operational_state=stopped`, `health_status=failed`, `observation_status=fresh`, Severity `critical`.
- Quelle: `youtube-research-graphiti-worker.service` über den Systemd-Collector.
- Nachweis: `ActiveState=failed`, `SubState=failed`, `systemd_Result=signal`, `ExecMainStatus=15`.
- Ursache laut aktueller Statusquelle: Prozessende durch Signal/Exitcode 15; der Auditkontext weist auf Timeout beziehungsweise Dienstproblem hin.
- Zuständiges System: Graphiti-Worker und dessen Lauf-/Timeout-Konfiguration.
- Änderung am Watcher erforderlich: Nein.
- Änderung an der überwachten Anwendung: Ja, wenn dieser Worker benötigt wird.

### `project.telefon.agent`

- Status: `operational_state=unknown`, `health_status=unknown`, `observation_status=unavailable`, Severity `warning`.
- Quelle: Docker-Collector, Containername `telefon-agent`.
- Nachweis: `container_exists=false`; Docker meldet, dass das Objekt nicht existiert.
- Der Watcher hält den letzten bekannten Jobstatus zurück und kennzeichnet die aktuelle Beobachtung separat als nicht verfügbar.
- Zuständiges System: Telefon-Agent-Deployment beziehungsweise Containerdefinition.
- Änderung am Watcher erforderlich: Nein.
- Änderung an der überwachten Anwendung oder Konfiguration: Ja, falls der Telefon-Agent weiter benötigt wird; alternativ muss die Definition bewusst aus dem Scope entfernt werden.

Diese drei Fälle sind Anwendungs- beziehungsweise Deploymentprobleme. Sie sind nicht als Ausfall des Watchers zu behandeln.

## Offene Punkte

Der zuletzt ausdrücklich offene Header-Punkt war:

- Titel und Untertitel links.
- Aktualisierungsinformationen und Button rechts.
- identische Inhaltsbreite wie Statuskacheln und Tabellen.
- keine dauerhafte dritte Zeile `Aktualisiert`.
- optionale temporäre Erfolgsmeldung nur inline in der zweiten Zeile.
- kein horizontaler Überlauf.

Dieser Punkt ist inzwischen nicht mehr offen, weil die abschließende Live-Abnahme am `2026-08-02` genau diese Kriterien geprüft hat. Der frühere offene Auftrag wird hier trotzdem als Entwicklungshistorie festgehalten:

- [x] Header-Ausrichtung innerhalb des Inhaltsrahmens live korrigiert und abgenommen.
- [x] Tabellenüberschriften und rechte Tabellenspalten innerhalb des Tabellenrahmens ausgerichtet und live ausgeliefert.

Weiterhin offen beziehungsweise nicht vollständig sprachlich abgenommen:

- [ ] Portal-Resttexte wie `?ffnen` und `Oeffnet` sprachlich beziehungsweise bezüglich Zeichencodierung bereinigen.
- [ ] Für die Warnkachel eine gesonderte fachliche Abnahme mit echten Statuswechseln durchführen; die aktuelle Kachel-Bridge und der aktive Warnzustand sind technisch nachgewiesen.

Keine dieser offenen UI-Aufgaben ist ein Nachweis für einen Watcherfehler.

## Bewusste Abgrenzungen

- Der Worker-Watcher ist eine Beobachtungs- und Bewertungsinstanz, keine Steuerung produktiver Jobs.
- Monitoring gegenüber Systemd, Docker und Prozessen bleibt read-only.
- Die eigene SQLite-Historie darf geschrieben werden; überwachte Systeme werden nicht verändert.
- Die Agent-Solutions-Zentrale zeigt verdichtete Watcherdaten und bewertet nicht doppelt.
- `degraded` beziehungsweise `critical` in der Warnkachel bedeutet nicht automatisch, dass der Watcher selbst defekt ist.
- Keine Auto-Healing-Funktion.
- Kein künstlicher Remote-Agent, solange kein echter Agent angebunden ist.
- Kein Browser-Spezialcollector ohne nachgewiesenen Browser-Worker.
- Keine fachliche Reparatur von Graphiti, YouTube E2E oder Telefon-Agent in dieser Dokumentation.
- Keine Datenbank-, Konfigurations- oder Dienständerung im Rahmen dieses Dokumentationsauftrags.

## Architekturentscheidungen

- Worker-Watcher bleibt zentrale Bewertungsinstanz.
- Agent-Solutions-Zentrale zeigt nur verdichtete Ergebnisse.
- Keine doppelte Alarmbewertung im Hauptpanel.
- Keine Auto-Healing-Funktion.
- Monitoring gegenüber überwachten Systemen bleibt read-only.
- Fehler überwachten Anwendungen werden von Watcherfehlern getrennt.
- Sortierung erfolgt je fachlicher Gruppe.
- Browser-Collector ist nicht erforderlich, solange keine Browser-Worker existieren.
- Remote-Agenten bleiben leer, solange keine Remote-Agenten angebunden sind.
- Interne Statuswerte bleiben englisch; sichtbare Standardtexte werden deutsch dargestellt.
- Zeitstempel des Browserabrufs und des Watcher-Zyklus werden getrennt gezeigt.
- UI-Feedback darf keine dauerhafte zusätzliche Zeile erzeugen.

## Geänderte Dateien

Die beiden Projekte liegen nicht in einem einheitlichen versionierten Projektzustand: `worker-watcher` ist ein ungetracktes Unterverzeichnis des übergeordneten Git-Repositories `/opt/struktur/hermes-workspace`; `/opt/struktur/portal` ist kein Git-Repository. Deshalb werden neben den aktuellen Hashes die Dateirollen und der beobachtete Status angegeben.

### Worker-Watcher

| Datei | Zweck und Änderung | Status |
|---|---|---|
| `/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/api.py` | API, Warnzusammenfassung, deutsche UI, Tabellen, Tabellenlayout, Sortierung, Header- und Aktualisierungsdarstellung | produktiv aktiv; Tabellenlayout-Neustart `2026-08-02T17:29:52Z`; SHA-256 `029ac71a5cb9497602aed329d39a00e98fd6a5a957f109aca0ab6b6c972c0b28` |
| `/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/alerts.py` | Verdichtung von Warnfällen und Portal-Summary | produktiv aktiv; SHA-256 `604d606837e3863c92e05a7a11f04535a80f378856c6edd8ce02ecf18523d6a2` |
| `/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/watcher.py` | globale Statusaggregation und Collector-Isolation | produktiv aktiv; SHA-256 `e485f3fcf6adbdd260070dee3d06a5e43bddb399ba751d09279f96b0fc90ed23` |
| `/opt/struktur/hermes-workspace/worker-watcher/tests/unit/test_alerts.py` | Unit-Tests der Warnzusammenfassung | lokal verifiziert; SHA-256 `b7dcb26b1aa1d6200e06f2b2ad54b570b858d6b93f5a9fae9fbbbacc2b1de9ed` |
| `/opt/struktur/hermes-workspace/worker-watcher/tests/integration/test_api_and_reports.py` | API-, Collector- und UI-Textnachweise | lokal verifiziert; SHA-256 `27b8ac2709aa7ba44099198f96f78f84385f204d8b19fc0067ecec201d691d23` |
| `/opt/struktur/hermes-workspace/worker-watcher/tests/integration/test_isolation.py` | Nachweis, dass Jobprobleme den Watcherstatus beeinflussen | lokal verifiziert; SHA-256 `9cef12e5d42dd0b9e0decf0c28ed6903904a70ea01c278c1d43426c4c65046b3` |
| `/opt/struktur/hermes-workspace/worker-watcher/README.md` | API- und Betriebsdokumentation | Dokumentation; SHA-256 `0d4f79b3f96cbac7e6ec9ae79eda5a41e1b1d4f36278cc4335ebaa7aa954becf` |
| `/opt/struktur/hermes-workspace/worker-watcher/docs/deployment-plan.md` | Produktivaktivierung, Rollback und Dienstbezug | Dokumentation; SHA-256 `3d571dfb93c0c0ba2daf13432659b420544ea4fdb9bd96ed60be8709ffc79ed0` |
| `/opt/struktur/hermes-workspace/worker-watcher/docs/audit-2026-08-01.md` | Historischer Audit und Ausgangswerte | Auditdokument; nicht durch diese Dokumentationsdatei verändert; SHA-256 `b2277aaaa8fb0d168e3a731bb6ebb1f52f945a6b5286edc608e33557c2298cea` |

### Agent-Solutions-Zentrale

| Datei | Zweck und Änderung | Status |
|---|---|---|
| `/opt/struktur/portal/app.py` | Portal, Warnkachel, serverseitige Watcher-Brücke, globale Aktualisierung und Layout | produktiv aktiv über `portal.service`; SHA-256 `361ceed6781bca4b1d73a1ad60508be9520349bd778b018becb79506a97fbd9f` |

Die Projektdateien sind im übergeordneten Workspace beziehungsweise im Portalverzeichnis nicht als sauberer gemeinsamer Git-Diff abnahmefähig. Das übergeordnete Workspace-Repository enthält zahlreiche bereits vorhandene Änderungen und ungetrackte Dateien; diese wurden nicht bereinigt oder überschrieben.

## Sicherungen und Auditunterlagen

### Historische Sicherung

Die vom Auftrag verlangte Sicherung existiert:

```text
/tmp/worker-watcher-before-sort-20260801.tar.gz
```

Nachweis zum `2026-08-02`:

- Größe: `595016` Bytes.
- Änderungszeit: `2026-08-01 20:31:16.895228003 +0000`.
- SHA-256: `3034b7fffd71dc3cea956c811bf25964df624e735aebd138b903e02a935169cf`.
- Ablage: nur unter `/tmp`, daher temporär und nicht als dauerhafte Archivierung geeignet.

### Aktuelle UI-Sicherungen

Für die letzten Worker-UI-Korrekturen wurden zusätzlich timestamped Backups unter `/opt/struktur/backups/` angelegt, unter anderem:

- `/opt/struktur/backups/worker-header-refresh-visual-20260802-170115/api.py`
- `/opt/struktur/backups/worker-refresh-inline-confirmation-20260802-165902/api.py`
- `/opt/struktur/backups/worker-header-content-frame-20260802-165738/api.py`

Für die Tabellenlayout-Korrektur wurde zusätzlich eine unmittelbare Sicherung angelegt:

- `/tmp/worker-watcher-api-before-table-layout-20260802T172834Z.py`
- SHA-256: `735f24c2183db1987d0b9110bd3eecc3b47f81991d9e90fada548c5187393ce3`

Das maßgebliche Auditdokument ist:

```text
/opt/struktur/hermes-workspace/worker-watcher/docs/audit-2026-08-01.md
```

## Nächste Schritte

### Priorität A

- [x] Header der Worker-Überwachung innerhalb des Inhaltsrahmens ausrichten und live abnehmen.
- [x] Dauerhafte blaue Meldung `Aktualisiert` entfernen; temporäres Inline-Feedback verifizieren.
- [x] Live-Abnahme von Desktop und Mobil durchführen.
- [ ] Graphiti-Worker separat untersuchen.
- [ ] Klären, ob der Telefon-Agent weiterhin benötigt wird oder aus der Watcher-Konfiguration entfernt werden soll.

### Priorität B

- [ ] Bezeichnung und Darstellung der Warnkachel sprachlich abschließend abnehmen.
- [ ] Prüfen, ob die Ereignishistorie bei echten Statuswechseln korrekt erweitert wird.
- [ ] Run-Ebene bei Bedarf für echte lokale One-Shot-Worker produktiv befüllen.
- [ ] Verbleibende Portaltexte wie `?ffnen` und `Oeffnet` korrigieren.

### Priorität C

- [ ] Remote-Agenten nur bei tatsächlichem Bedarf anbinden.
- [ ] Alerts oder weitere Benachrichtigungen erst nach fachlicher Entscheidung bewerten.
- [ ] Auto-Healing weiterhin nicht aktivieren.

## Abnahmestatus

### Nachgewiesen

- Worker-Watcher-Prozess und HTTP-API produktiv erreichbar.
- Datenbank erreichbar, Schema-Version 2 aktiv.
- Drei aktive Collector, zwei deaktivierte Collector.
- 22 Jobs und 22 Instanzen sichtbar.
- Warnzusammenfassung mit drei aktiven Warnfällen verfügbar.
- Portal-Brücke liefert die Watcher-Zusammenfassung.
- Warnkachel und Aktualisierungsfunktionen technisch verifiziert.
- Header-Inhaltsrahmen stimmt mit der Kachel-/Tabellenbreite überein.

### Fachlich degraded

- `project.youtube.e2e` ist geladen, aber inaktiv und fachlich beeinträchtigt.
- `project.youtube.graphiti` ist mit Exitcode 15 fehlgeschlagen.
- `project.telefon.agent` ist als Docker-Quelle nicht verfügbar.
- Der Docker-Collector meldet deshalb einen Collectorfehler; der Watcher läuft trotzdem weiter.

### Offen

- Fachliche Behandlung der drei überwachten Anwendungsprobleme.
- Sprachliche Restkorrekturen im Portal.
- Echte Run-Historie für Quellen ohne Run-ID.
- Entscheidung über Remote-Agenten und spätere Benachrichtigungen.

## Verwandte Obsidian-Notizen

Der aktive Obsidian-Vault ist `/opt/obsidian-vault`. Der laufende Container `obsidian` bindet diesen Hostpfad als `/vaults/vault` ein; die dort vorhandene `README.md`, die Ordnerstruktur und aktuelle Notizänderungen bestätigen die aktive Wissensablage. Der Ordner `/opt/struktur/obsidian/vault.DISABLED_legacy_20260521` bleibt ausdrücklich unberücksichtigt.

Die technische Abschlusskonvention verlangt die kanonische Ablage in der `Systemstruktur`; deshalb liegt diese Notiz unter `Systemstruktur/` und nicht in `Agent-Solutions/`, `Reports` oder einem Zwischenordner.

Tatsächlich im aktiven Vault vorhandene thematische Notizen:

- [[Obsidian-Best-Practices]] — Konventionen für Ordner, Wikilinks und Tags.
- [[KARLO]] — bestehende Kontextnotiz.
- [[OpenClaw_Wissensdokumentation]] — bestehende Hermes-/OpenClaw-Dokumentation.

Eine aktive thematische Hauptnotiz `Worker-Watcher` oder `Agent Solutions Zentrale Steuerung` existiert nicht; deshalb wurden keine erfundenen oder leeren Stub-Wikilinks angelegt.

## Nachweise und Quellen

- Worker-Watcher-Projekt: `/opt/struktur/hermes-workspace/worker-watcher`
- Worker-Watcher-Quelloberfläche: `/opt/struktur/hermes-workspace/worker-watcher/src/worker_watcher/api.py`
- Worker-Watcher-Konfiguration: `/opt/struktur/hermes-workspace/worker-watcher/config.yaml`
- Worker-Watcher-Datenbank: `/opt/struktur/hermes-workspace/worker-watcher/data/watcher.sqlite`
- Worker-Watcher-Audit: `/opt/struktur/hermes-workspace/worker-watcher/docs/audit-2026-08-01.md`
- Portal-Projekt: `/opt/struktur/portal`
- Portal-Quelldatei: `/opt/struktur/portal/app.py`
- Dienst: `hermes-worker-watcher.service`
- Dienst: `portal.service`
- Health: `http://127.0.0.1:8088/health`
- Live-Health: `http://127.0.0.1:8088/health/live`
- Readiness: `http://127.0.0.1:8088/health/ready`
- Status: `http://127.0.0.1:8088/api/v1/status`
- Jobs: `http://127.0.0.1:8088/api/v1/jobs`
- Ereignisse: `http://127.0.0.1:8088/api/v1/events`
- Collector: `http://127.0.0.1:8088/api/v1/collectors`
- Collector-Läufe: `http://127.0.0.1:8088/api/v1/collectors/runs`
- Warnzusammenfassung: `http://127.0.0.1:8088/api/v1/alerts/summary`
- Portal-Brücke: `http://127.0.0.1:5052/api/worker-alerts`
- Öffentliche Worker-Oberfläche: `https://worker.agentsolutions-mallorca.com`
- Öffentliche Zentrale: `https://agentsolutions-mallorca.com`
- Sicherung: `/tmp/worker-watcher-before-sort-20260801.tar.gz`
- Endgültige Obsidian-Notiz: `/opt/obsidian-vault/Systemstruktur/2026-08-02 Worker-Watcher und Agent-Solutions-Zentrale – Projektstand.md`
- Zwischenablage vor Migration: `/opt/struktur/reports/2026-08-02 Worker-Watcher und Agent-Solutions-Zentrale – Projektstand.md`; nach erfolgreicher Endprüfung entfernt.